package org.funtester.performance.books.chapter11.section4;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;

/**
 * 全局唯一标识符JMH测试
 */
@BenchmarkMode(Mode.Throughput)// 制定运行测试模式,当前为吞吐量模式
@State(value = Scope.Thread)//默认为Scope.Thread,含义是每个线程都会有一个实例
@Warmup(iterations = 1, time = 10, timeUnit = TimeUnit.SECONDS)//预热次数,含义是每个测试会跑多久
@Measurement(iterations = 1, batchSize = 1)//测试迭代次数,批次大小
@Threads(100)//测试线程数
@Fork(value = 1, jvmArgs = {"-Xms1G", "-Xmx1G"})//fork表示每个测试会fork出几个进程
@OutputTimeUnit(TimeUnit.MICROSECONDS)//输出时间单位
public class UniqueTest {

    @Benchmark
    public void uuid() {
        UniqueUtils.getUUID();
    }

    @Benchmark
    public void snow() {
        UniqueUtils.getSnowMark();
    }

    @Benchmark
    public void exclusive() {
        UniqueUtils.getExclusiveMark();
    }

    @Benchmark
    public void atomic() {
        UniqueUtils.getAtomicMark();
    }

    public static void main(String[] args) throws RunnerException {
        Options options = new OptionsBuilder()
                .include(UniqueTest.class.getSimpleName())//测试类名
                .result("result.json")//测试结果输出到result.json文件
                .resultFormat(ResultFormatType.JSON)//输出格式
                .build();
        new Runner(options).run();
    }

}
